<?php
/**
 * Klasse zur Anzeige und Verwaltung von Slots
 *
 * @author		Joachim Ruf
 * @copyright	Copyright (c) 2003-2010 Loresoft Software (http://www.loresoft.de)
 * @license		http://yapary.loresoft.de/lizenzbedingungen     New BSD License
 *
 * */


Class Yapary_Marketing_AdServerSlot Extends Yapary_Attribute
{
    /** @var Sql-Klasse fuer Datenbankzugriff */
    private $oSql;

    /** @var Aktuelle Ad-Server Konfiguration */
    private $config;

    private $dbTableName = 'yapary_ad_server_slot';


    /**
     * Anlegen und Verwalten von AdServer-Slots
     * @param Sql $oSql					: Sql-Klasse fuer Datenbankzugriff
     * @param string $_adServerConfig	: Ad-Server-Konfiguration
     * */
    function __construct (Yapary_Db_Sql_Connector $_oSql, $_adServerConfig = Yapary_Marketing_AdServerConfig::LIVE)
    {
		if (!$_oSql->database()->table($this->dbTableName)->exists()) {
            $e = new Exception();
            $arrTrace = $e->getTrace();
            $trace = '<b>'.$arrTrace[0]['class'].$arrTrace[0]['type'].$arrTrace[0]['function'].'</b> in <b>'.$arrTrace[0]['file'].'</b> on line <b>'.$arrTrace[0]['line'].'</b>';
            trigger_error('<pre></b>No database installed<br />'.$trace.'</pre>', E_USER_WARNING);
		}

		$this->oSql   = $_oSql;
        $this->config = $_adServerConfig;
    }


    /**
     * Prueft ob der angegebene Slot existiert
     * @param mixed $slotId		: Einmaliger Name/Id des Slots
     * @return bool
     * */
    public function exists ($slotId)
    {
        $oDbResult = $this->oSql->request('SELECT Id
        					  FROM ad_server_slot
        					  WHERE Id=:id',
                            array('id' => $slotId));

        if ($oDbResult->getCount() == 1) {
            return true;
        }

        return false;
    }


    /**
     * Aktiviert/Deaktiviert einen existierenden Slot
     * @param mixed $slotId		: Einmaliger Name/Id des Slots
     * @param bool $enable		: {true|false} zum aktivieren/deaktivieren
     * @return bool
     * */
    public function enable ($slotId, $enable)
    {
        if (!$this->exists($slotId)) {
            return false;
        }

        $oDbResult = $this->oSql->request('UPDATE ad_server_slot
                					 SET Status=:status
                					 WHERE Id=:id',
                                    array('id'     => $slotId,
                                          'status' => ($enable === true) ? 1 : 0));
        return true;
    }


    /**
     * Prueft ob der Slot fuer LIVE aktiviert ist
     * @return array
     * */
    public function isEnabled ($slotId)
    {
        $oDbResult = $this->oSql->request('SELECT Status
        					  FROM ad_server_slot WHERE Id=:id',
                            array('id' => $slotId));

        if ($oDbResult->getCount() == 1) {
            $row = $oDbResult->getNext();
            return ($row->Status == 1) ? true : false;
        }

        return NULL;
    }


    /**
     * Liefert den Slot inklusive Content
     * @param mixed $slotId		: Einmaliger Name/Id des Slots
     * @return string|NULL
     * */
    public function display ($slotId)
    {
        // Daten laden
        $oDbResult = $this->oSql->request('SELECT *
        					  FROM ad_server_slot
        					  WHERE Id=:id',
                            array('id' => $slotId));
        if ($oDbResult->getCount() == 1) {
            $row = $oDbResult->getNext();
        } else {
            return NULL;
        }

        // Attribute und Content
        $arrAttributes = unserialize($row->Attributes);
        $content       = unserialize($row->Content);
        $arrAttributes['class'] = isset($arrAttributes['class']) ? 'adServerSlot '.$arrAttributes['class'] : 'adServerSlot';

        // Auswerten und anzeigen
        switch ($this->config) {
            case Yapary_Marketing_AdServerConfig::LIVE:
                if ($row->Status == 1) {
                    $this->oSql->request('UPDATE ad_server_slot
                    					 SET Requests=Requests+1
                    					 WHERE Id=:id',
                                        array('id' => $slotId));
                    $content = (isset($row->Content)) ? $content : '';
                    return '<div'.$this->arrayToAttribute($arrAttributes, true).'>'. $content .'</div>';
                } else {
                    return '';
                }
                break;
            case AdServerConfig::TEST:
                return '<div'.$this->arrayToAttribute($arrAttributes, true).'>'. $content .'</div>';
                break;
            case AdServerConfig::DEBUG:
                $arrAttributes['style'] = (isset($arrAttributes['style'])) ? 'overflow: scroll; font-size: 10px; '.$arrAttributes['style'] : 'overflow: scroll; font-size: 10px;';
                return '<div'.$this->arrayToAttribute($arrAttributes, true).'><pre>'. htmlentities($content).'<br />'.print_r($arrAttributes, true) .'</pre></div>';
                break;
            default:
                throw new Exception('Slot-Konfiguration ('.$this->config.') ist keine gueltige Konfiguration');
        }
    }


    /**
     * Erstellt einen neuen Slot
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @param array $arrAttribute	: Attribute der Konfiguration {style|class|id|...}
     * @return bool
     * */
    public function add ($slotId, array $arrAttributes = array())
    {
        if ($this->exists($slotId)) {
            trigger_error('Slot '.$slotId.' existiert bereits', E_USER_NOTICE);
        }

        $oDbResult = $this->oSql->request('INSERT INTO ad_server_slot
                					 (Id, Attributes) VALUES (:id, :attributes)',
                                    array('id'         => $slotId,
                                          'attributes' => serialize($arrAttributes)));
        return true;
    }


    /**
     * Loescht einen vorhandenen Slot
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @return bool
     * */
    public function delete ($slotId)
    {
        if (!$this->exists($slotId)) {
            trigger_error('Slot '.$slotId.' existiert nicht!', E_USER_NOTICE);
        }

        $oDbResult = $this->oSql->request('DELETE FROM ad_server_slot
        					  		 WHERE Id=:id',
                                    array('id' => $slotId));
        return true;
    }


    /**
     * Fuellt einen vorhandenen Slot mit Content
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @param mixed $content		: Content der angezeigt werden soll
     * @return bool
     * */
    public function fill ($slotId, $content, array $arrAttributes = array())
    {
        if (!$this->exists($slotId)) {
            trigger_error('Slot '.$slotId.' existiert nicht!', E_USER_NOTICE);
        }

        if (count($arrAttributes) == 0) {
            $oDbResult = $this->oSql->request('UPDATE ad_server_slot
                    					 SET Content=:content
                    					 WHERE Id=:id',
                                        array('id'         => $slotId,
                                              'content'    => serialize($content)));
            return true;
        } else {
            $oDbResult = $this->oSql->request('UPDATE ad_server_slot
                    					 SET Content=:content, Attributes=:attributes
                    					 WHERE Id=:id',
                                        array('id'         => $slotId,
                                              'content'    => serialize($content),
                                              'attributes' => serialize($arrAttributes)));
            return true;
        }
        
        return false;
    }


    /**
     * Liefet alle SlotIds
     * @return array
     * */
    public function getIds ()
    {
        $arrResult = array();

        $oDbResult = $this->oSql->request('SELECT Id
        					  FROM ad_server_slot');
        if ($oDbResult->getCount() == 0) {
            return $arrResult;
        }

        while ($row = $oDbResult->getNext()) {
            $arrResult[] = $row->Id;
        }

        return $arrResult;
    }


    /**
     * Liefet den Content des angegebenen Slots
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @return string|NULL
     * */
    public function getContent ($slotName)
    {
        $oDbResult = $this->oSql->request('SELECT Content
        					  FROM ad_server_slot
        					  WHERE Id=:id',
                            array('id' => $slotName));

        if ($oDbResult->getCount() == 0) {
            return NULL;
        } else {
            $row = $oDbResult->getNext();
            return (string) unserialize($row->Content);
        }
    }


    /**
     * Liefet die Attribute des angegebenen Slots
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @return array|NULL
     * */
    public function getAttribute ($slotName)
    {
        $oDbResult = $this->oSql->request('SELECT Attributes
        					  FROM ad_server_slot
        					  WHERE Id=:id',
                            array('id' => $slotName));

        if ($oDbResult->getCount() == 0) {
            return NULL;
        } else {
            $row = $oDbResult->getNext();
            return (array) unserialize($row->Attributes);
        }
    }


    /**
     * Liefet die Anzahl der Aufrufe (bei LIVE)
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @return int
     * */
    public function getRequest ($slotName)
    {
        $oDbResult = $this->oSql->request('SELECT Requests
        					  FROM ad_server_slot
        					  WHERE Id=:id',
                            array('id' => $slotName));

        if ($oDbResult->getCount() == 0) {
            return NULL;
        } else {
            $row = $oDbResult->getNext();
            return (int) $row->Requests;
        }
    }


    /**
     * Liefet die Anzahl der Aufrufe (bei LIVE)
     * @param mixed $slotId			: Einmaliger Name/Id des Slots
     * @return int
     * */
    public function resetRequest ($slotName)
    {
        $oDbResult = $this->oSql->request('UPDATE ad_server_slot
                				     SET Requests=0
                					 WHERE Id=:id',
                                    array('id' => $slotName));
        return true;
    }
}


?>